package com.runtu.infrastructure.dcc;

import com.runtu.types.DCCValue;
import com.runtu.types.common.Constants;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.List;

/**
 * @ClassName DCCService
 * @Description 动态配置服务
 * @date 2025/7/26 20:31
 * @Version 1.0
 */
@Service
public class DCCService {
    //降级开关和切量开关的加载 放在app层 的DCC的config配置类(DCCValueBeanFactory)实现的
    /**
     * 降级开关 0关闭 1是开启 并且配置了key和默认值
     * 如果对应的redis里面有对应的key值(也就是downgradeSwitch) 就用redis里面的值，否则就用默认值0
     */
    @DCCValue("downgradeSwitch:0")
    private String downgradeSwitch;

    /**
     * 人群切量开关 同上
     */
    @DCCValue("cutRange:100")
    private String cutRange;

    @DCCValue("scBlacklist:s02c02")
    private String scBlacklist;


    //提供两个内聚的方法，用来判断是否降级和判断切量，聚合在这 其他地方用的时候比较方便
    // (也就是当前的用户的hash值最后两位是否在切量范围内(默认100)进行切量)
    public  boolean isDowngradeSwitch() {
        return "1".equals(downgradeSwitch);//true表示开启降级，false表示关闭降级
    }

    //判断当前用户的hash值 是否属于切量内 属于返回true
    public boolean isCutRange(String userId) {
        //hash值可能是负数 但是我们这里切量都为正数 所以abs一下
        int hashCode = Math.abs(userId.hashCode());
        
        //取最后两位
        int lastTwoDigits = hashCode % 100;

        //如果最后两位在切量以内
        if (lastTwoDigits <= Integer.parseInt(cutRange)) {
            return true;
        }
        return false;
    }

    /**
     * 判断黑名单拦截渠道，true 拦截、false 放行
     */

    public boolean isSCBlackIntercept(String source, String channel) {
        String[] split = scBlacklist.split(Constants.SPLIT);
        List<String> list = Arrays.asList(split);
        return list.contains(source+channel);

    }

    //而切量和降级开关是如何填充的呢？通过实现类DCCValueBeanFactory填充


}
